package com.cskaoyan.javase.oop1._13block._4extend;

/**
 * 关于类加载，代码的补充/扩展知识：
 * 类加载的大致步骤： 加载 --> 链接 --> 初始化
 * 结论：
 *      1.类初始化步骤完成之前，这个类就可以创建对象了。
 *          加载喝连接的步骤是为了JVM了解认识该类型
 *          而初始化的步骤是为了执行static
 *          创建对象，不依赖于完成类加载（初始化）。
 *      2.某个类一旦开始进行初始化，就不会再重复进行一次初始化了！
 *          类加载只有一次，更准确的说法是： 类的初始化只有一次
 *
 *
 * @since 10:40
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(A.a);
    }
}

class A {
    /*
        在类加载的过程中
        加载和连接是为了JVM了解该类型
        而初始化步骤是为了执行static相关内容
        也就是在方法调用时，JVM调用的clinit方法，就是初始化的步骤

        该类的初始化已经通过访问A的静态成员变量触发了
        不会再一次类初始化了（这里new对象不会再次触发类初始化）
        并且该类已经完成加载-->连接，创建它的对象是完全可以了

        所以在类初始化的过程中，静态成员变量创建自身对象
        是完全可以直接进行的,直接调用构造器即可
     */
    static A a = new A();

    public A() {
        System.out.println("6666");
    }
}